package com.yt.Insurance.server.common.exception;

import com.alibaba.fastjson.JSON;
import com.yt.common.constant.CommonParameter;
import com.yt.common.constant.Result;
import com.yt.common.enums.CodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * @Description ：创建全局异常处理类：通过使用@ControllerAdvice定义统一的异常处理类，而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型，最后将Exception对象和请求URL映射到error.html中
 * @Author ： 解风
 * @Date ： 2017/09/26 14:22
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    public static final String DEFAULT_ERROR_VIEW = "error";

    /**
     * 应用到所有@RequestMapping注解方法，在其执行之前初始化数据绑定器
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {}

    /**
     * 把值绑定到Model中，使全局@RequestMapping可以获取到该值
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("author", "Magical Sam");
    }


//    @ExceptionHandler(value = Exception.class)
//    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
//        ModelAndView mav = new ModelAndView(); mav.addObject("exception", e);
//        mav.addObject("url", req.getRequestURL());
//        mav.setViewName(DEFAULT_ERROR_VIEW);
//        return mav;
//    }
    // 判断发生异常的类型是除0异常则做出响应
//		if(e instanceof ArithmeticException){
//        return "全局：发生了除0异常";
//    }

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result jsonErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        Result rs = new Result();
        rs.setCode(CodeEnum.FAIL_100005.getCode());
        rs.setMsg(CodeEnum.FAIL_100005.getMsg());
        e.printStackTrace();
        log.error("系统异常参数====>"+ JSON.toJSONString(CommonParameter.getHeadParamsBO().getBodyParams()), e);
        return rs;
    }


}
